﻿﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;


public static class ObjectExtension
{
   

    /// <summary>
    /// 首字母大写
    /// </summary>
    /// <param name="value"></param>
    /// <returns></returns>
    public static string ToUpperFirstword(this string value)
    {
        if (string.IsNullOrWhiteSpace(value))
            return string.Empty;

        string result = string.Empty;
        //先判断字符中是否 下划线
        string[] words = value.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries);
        //如果当前字符串长度为1，则直接对其 Upper
        if (value.Length <= 1)
        {
            return value.ToUpper();
        }
        //如果 该字符中有无划线“_”字符，那么words.Length=1，首字符大写，其他字符小写。
        else if (words.Length <= 1)
        {
            result = value.Substring(0, 1).ToUpper() + value.Substring(1, value.Length - 1).ToLower();
        }
        else
        {
            //如果当前字符中有下划线，就表示有多个word，将每个word首字符大写，其余字符小写。
            List<string> lst = new List<string>();
            foreach (string word in words)
            {
                if (!string.IsNullOrEmpty(word))
                {
                    string temp = word.Substring(0, 1).ToUpper() + word.Substring(1, word.Length - 1).ToLower();
                    lst.Add(temp);
                }
            }
            //最后用 “—” 拼接
            result = string.Join("_", lst);

            //Split会把最后"_"去除，判断当前字符尾部是否是 “—”
            if (value.EndsWith("_"))
            {
                result += "_";
            }
        }
        return result;
    }

    /// <summary>
    /// 根据 DataTable首列 获取List 值集合
    /// </summary>
    /// <typeparam name="T">列值类型</typeparam>
    /// <param name="data">DataTable</param>
    /// <returns></returns>
    public static List<T> GetFirstCol<T>(this DataTable data)
    {
        List<T> lst = new List<T>();
        if (data == null || data.Rows.Count <= 0)       //如果没有数据直接返回空列表
        {
            return lst;
        }
        else
        {
            foreach (DataRow dr in data.Rows)           //有数据时遍历的方式转换为列表方式
            {
                if (dr[0] != null)
                {
                    T t = (T)Convert.ChangeType(dr[0], typeof(T));      //============== Convert语句前面不需要强制转换类型，因为后面已经指定转换类型。 ===================
                    lst.Add(t);
                }
            }
        }
        return lst;
    }

    /// <summary>
    /// 反射获取枚举所有 Dictionary 枚举值 （扩展方法）
    /// </summary>
    /// <param name="em">枚举对象</param>
    /// <param name="underlyingInt">是否是获取对应枚举对象的Int值</param>
    /// <returns></returns>
    public static Dictionary<string, string> GetDictEnums(this Enum em, bool underlyingInt = false)
    {
        Dictionary<string, string> dict = new Dictionary<string, string>();
        Type tyEnum = em.GetType();
        foreach (string str in tyEnum.GetEnumNames())
        {
            dict.Add(str, str);
            if (underlyingInt)
            {
                dict[str] = Convert.ToInt32(Enum.Parse(tyEnum, str)).ToString();
            }
        }
        return dict;
    }

    /// <summary>
    /// 反射获取枚举所有 List 枚举值 （扩展方法）
    /// </summary>
    /// <param name="em">枚举对象</param>
    /// <param name="underlyingInt">是否是获取对应枚举对象的Int值</param>
    /// <returns></returns>
    public static List<string> GetListEnums(this Enum em, bool underlyingInt = false)
    {
        List<string> lstEnums = new List<string>();
        Type tyEnum = em.GetType();
        foreach (string str in tyEnum.GetEnumNames())
        {
            string item = str;
            if (underlyingInt)
            {
                item = Convert.ToInt32(Enum.Parse(tyEnum, str)).ToString();
            }
            lstEnums.Add(item);
        }
        return lstEnums;
    }
}

